#!/usr/bin/python
# -*- coding: utf-8 -*-

"""Генератор страниц
"""

import os
import logging
import datetime
from engine import settings
from engine import styles
from engine.data import news
from engine.data import cites
from engine.data import pages
from google.appengine.api import users
from google.appengine.ext.webapp import template


def getFileContent(filePath):
  """Получить содержимое файла
  Args:
    filePath: путь к файлу относительно текущего каталога
  """
  
  fileContent = os.path.exists(os.path.join(os.path.dirname(__file__), filePath))
  
  if fileContent:                            # проверяем - существует ли файл
    fileContent = os.path.join(os.path.dirname(__file__), filePath)
    try:                                     # если файл существует - пытаемся его открыть и прочитать
      f = open(fileContent, 'r')
      fileContent = f.read()
    except:
      fileContent = 'foe' # file open error
      logging.error('getFileContent: open file <%s> error!' % filePath)
  else:
    fileContent = 'fnf'   # file not found
    logging.warning('getFileContent: file <%s> not found' % filePath)
  
  return fileContent


def writeHeaders(self, status = 200, expires = 7):
  """Запись заголовков страницы
  Args:
    self: класс страницы
    status: код ответа (по-умолчанию - 200 OK)
    expires: время устаревания (по-умолчанию - 7 дней)
  """

  expires = datetime.datetime.utcnow() + datetime.timedelta(expires)
  self.response.set_status(status)
  self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
  self.response.headers.add_header('Content-Language', 'ru')
  self.response.headers.add_header('Expires', expires.strftime("%d %b %Y %H:%M:%S GMT"))
  #self.error(status)


def getMenu(IsAdmin=False):
  """Загрузка меню
  Args:
    IsAdmin: загружаем меню администрирования или нет (по-умолчанию - нет).
  """

  if not IsAdmin:     # определяем какое меню загружать
    type = 'pages'
  elif IsAdmin:
    type = 'admin'

  # пытаемся загрузить меню из файла
  menu = getFileContent(settings.blocksPath + '_menu_' + type + '_' + settings.ENCODING + '.blk')
  
  if (menu == 'fnf') or (menu == 'foe'):  # если не получилось загрузить меню
    menu = '<h1 style="color: red;">Меню не найдено!</h1>'
    logging.warning('getMenu: menu IsAdmin=%s not opened!' % IsAdmin)

  return menu


def getContent(blockContent):
  """Получаем содержание запрошенной страницы.
  Args:
    blockContent: запрошенный раздел сайта
  """
  
  status = 200                     # статус ответа по-умолчанию OK
  
  if blockContent == 'news':       # если запросили раздел новостей
    content = news.GetNews(False)  # получаем ВСЕ новости из базы
    if content == None:
      content = 'nonews'           # устанавливаем тэг отсутствия новостей, если их нет
      logging.warning('getContent: no news exists for page <%s>' % blockContent)
  elif blockContent.startswith('/admin'): # если запросили раздел администрирования - считываем раздел из файла
    content = getFileContent(settings.blocksPath + blockContent + '_' + settings.ENCODING + '.blk')
    if content == 'fnf':           # ошибка - файл не найден
      content = '<h1 style="color: red;">Раздел не найден</h1>'
      status = 404
    elif content == 'foe':         # ошибка - проблема со считыванием файла
      content = '<h1 style="color: red;">Ошибка загрузки раздела</h1>'
      status = 500
  else:                            # если запросили любой другой раздел
    if blockContent == 'main':
      blockContent = ''            # для главной страницы - блок пустой
    content = pages.GetPages(settings.ROOT + blockContent) # получаем раздел из базы

  if not content:                  # если не загрузилось содержимое страницы
    #content = errorLoadBlock(404, 'content')
    content = pages.GetPages('404')# устанавливаем ошибку - страница не найдена
    status = 404
    logging.warning('getContent: page <%s> not found!' % blockContent)
    
  if content == None:              # если ни одна страница не загрузилась - сайт не настроен (в базе пусто)
    content = '<h1 style="color: red;">Сайт в разработке</h1><br>На сайте отсутсвуют страницы.<br>\
                Пожалуйста, зайдите в раздел администрирования и добавьте страницы.'
    logging.error('getContent: pages don`t exist in DB (page requested: %s)' % blockContent)
    status = 500

  return content, status           # возвращаем результат и статус страницы


def getUser(user = None):
  """Загрузка блока пользователя
  Args:
    user: текущий пользователь
  """

  if user:
    user_block = ("Welcome, <a href=\"mailto:%s\">%s</a>! (<a href=\"%s\">sign out</a>)" % (user.email(), user.nickname(), users.create_logout_url("/")))
    if users.is_current_user_admin():
      user_block = ("%s<br><a href=\"/admin/\">Adminko</a>" % user_block)
  else:
    user_block = ("<a href=\"%s\"> Sign in or register</a>." % users.create_login_url("/"))
     
  return user_block
  
def generateEmbed(templateFile, data):
  """Генератор встраиваемого кода для фишек
  Args:
    template: шаблон (относительно пути, где лежат шаблоны
    data: данные
  """
  tpl_file = os.path.join(os.path.dirname(__file__), settings.templatesPath + templateFile + '.tpl')
  if os.path.exists(tpl_file):
    embed_out = template.render(tpl_file, { 'entrys': data })
  else:
    embed_out = 'error'
  sel.response.out.write(embed_out)

def generatePage(self, pagereq, template_values):
  """Генератор страниц
  Args:
    self: класс
    pagereq: запрошенная страница (раздел) относительно корня
    template_values: параметры шаблона страницы
  """

  # *** определяем, какой шаблон использовать ***
  if pagereq == settings.ROOT:                                              # главная страница
    tpl_file = 'page_main'
    pagereq = 'main'
  elif pagereq.startswith('/admin'):                                        # админка
    tpl_file = 'page_admin'
  elif os.path.exists( os.path.join(os.path.dirname(__file__),              # страница
                       settings.templatesPath + 'page_' + pagereq + '_' + settings.ENCODING + '.tpl') ):
    tpl_file = 'page_' + pagereq
  elif os.path.exists( os.path.join(os.path.dirname(__file__),              # модуль
                       settings.templatesPath + 'feature_' + pagereq + '_' + settings.ENCODING + '.tpl') ):
    tpl_file = 'feature_' + pagereq
  else:                                                                     # любая другая страница
    tpl_file = 'page_simple'

  page = getContent(pagereq)                                      # получаем содержание страницы и статус
  template_values.update(                                         # обновляем значения параметров шаблона
          #portal_title = settings.SITETITLE,                     # ...заголовок сайта
          portal_caption = settings.SITECAPTION,                  # ...название сайта
          portal_keywords = settings.KEYWORDS,                    # ...ключевые слова сайта (тэг meta keywords)
          page_menu = getMenu(pagereq.startswith('/admin')),      # ...меню (админки или обычное)
          page = page[0],                                         # ...содержание страницы
          page_user = getUser(users.get_current_user()) )         # ...блок пользователя
  template_values.update(page_styles = styles.getStyles(pagereq)) # получаем стили страницы

  if pagereq == 'main':         # параметры главной страницы
    n = news.GetNews()          # загружаем новости
    c = cites.GetCites()        # загружаем цитаты

    if not n:
      n = '<h1 style="color: red;">Ошибка загрузки новостей</h1>'
      logging.warning('generatePage: error loading news on page <%s>' % pagereq)
    else:
      n = n.Text        # если новость получена, забираем ее текст

    if not c:
      c = '<h1 style="color: red;">Ошибка загрузки цитат</h1>'
      logging.warning('generatePage: error loading cites on page <%s>' % pagereq)

    # выставляем параметры шаблона для новостей и цитат
    template_values.update( page_news = n, page_cite = c )
  
  # генерируем шаблон
  path_template = os.path.join( os.path.dirname(__file__), 
                                settings.templatesPath + tpl_file + '_' + settings.ENCODING + '.tpl')
  page_out = template.render(path_template, template_values)
  
  writeHeaders(self, page[1])         # прописываем заголовки
  self.response.out.write(page_out)   # выводим страницу